package com.limit.annotation;


import com.limit.enums.RateLimitStrategyEnum;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 滑动窗口限流
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Inherited
@Documented
public @interface SlidingWindowLimit {

    /**
     * 最大请求次数
     */
    long maxRequestCount() default 10L;

    /**
     * 最大时间间隔(秒)
     * 即: 在 maxTimeInterval() 秒内, 最多请求 maxRequestCount()次服务
     */
    int maxTimeInterval() default 2;

    /**
     * 限流策略，默认为方法策略
     * <p>方法策略-> key为：rateLimit:METHOD_NAME:IP</p>
     * IP策略-> key为：rateLimit:IP
     *
     * @return RateLimitStrategyEnum 限流策略枚举
     */
    RateLimitStrategyEnum[] strategy() default RateLimitStrategyEnum.METHOD;


}
